package com.wzw.basics.collection.map;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TreeMap;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 根据 Java7 HashMap 的介绍，我们知道，查找的时候，根据 hash 值我们能够快速定位到数组的
 * 具体下标，但是之后的话，需要顺着链表一个个比较下去才能找到我们需要的，时间复杂度取决
 * 于链表的长度，为 O(n)。为了降低这部分的开销，在 Java8 中，当链表中的元素超过了 8 个以后，
 * 会将链表转换为红黑树，在这些位置进行查找的时候可以降低时间复杂度为 O(logN)。
 *
 * 底层数据结构采用 数组+链表+红黑树
 * HashMap 里面是一个数组，然后数组中每个元素是一个单向链表。
 * 数组中保存的是一个链表，其对象类型时Node<k,v>。每一个Node对象，包含其key的hash值、key、value、next（即其指向的下一个Node）
 * 默认容量为16 [0-15]，通过当前对存入对象的 key的hash值（int类型）%数组长度 确定其在中的数组索引值
 * 如果hash(key)发生哈希碰撞，及不同对象的计算出来的hash值相同。那么它在数组中的索引值也会相同，
 * capacity：当前数组容量，始终保持 2^n，可以扩容，扩容后数组大小为当前的 2 倍
 * 扩容因子(loadFactor)默认是0.75F
 * 扩容的阈值(threshold)是 capacity * loadFactor
 * resize
 * @author Wangzhiwen
 */
public class HashMapPrinciple {

    public static void main(String[] args) {
        Map<Integer,Integer> map = new HashMap<>(2);
        map = new ConcurrentHashMap<>();
        map.put(1,2);

        ConcurrentHashMap<Integer, Integer> concurrentHashMap = new ConcurrentHashMap<>();
        concurrentHashMap.put(1, 1);

        // for (;;) {
        //     System.out.println(111);
        // }

        LinkedHashMap<Integer, Integer> linkedHashMap = new LinkedHashMap<>();
        linkedHashMap.put(1, 1);

        TreeMap<Integer, Integer> treeMap = new TreeMap<>();
    }

}
